import numpy as np
import cv2
src_list=[]
def click_event(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x, ',',y)
        src_list.append((x,y))
        font = cv2.FONT_HERSHEY_SIMPLEX
        strXY = str(x) + ', '+ str(y)
        cv2.putText(img, strXY,(x,y), font, 1,(255,255,0),1)
        cv2.imshow('image', img)
    if event == cv2.EVENT_RBUTTONDOWN:
                blue = img[y, x, 0]
                green = img[y, x, 1]
                red = img[y, x, 2]
                font = cv2.FONT_HERSHEY_SIMPLEX
                strBGR = str(blue) + ', '+ str(green)+ ', '+ str(red)
                #cv2.namedWindow('image',0)
                cv2.putText(img, strBGR, (x ,y), font, 2, (0,255,255), 3)
                cv2.imshow('image',img)
#img = np.zeros((512,512,3),np.uint8)




cv2.namedWindow('image',0)
img = cv2.imread("./PerspectiveTransform.jpg",1)  #读取图片
cv2.imshow('image',img)
cv2.setMouseCallback('image',click_event)
cv2.waitKey(0)
cv2.imwrite('./point_param.jpg',img)
cv2.destroyAllWindows()
scale_percent = 100       # 图片缩小比例
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
img = cv2.resize(img, dim, interpolation = cv2.INTER_AREA) 
#图片尺寸过大会影响处理效率，所以进行缩放



print('Resized Dimensions : ',img.shape)
for i, pt in enumerate(src_list):
    print(i,pt)
    cv2.circle(img, pt, 5, (0, 0, 255), -1)               #cv2.circle根据给定的圆心和半径等画圆
    cv2.putText(img,str(i+1),(pt[0]+5,pt[1]+10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
pts1 = np.float32(src_list)  #原始图像四个顶点
pts2 = np.float32([[0, 0], [0, 480], [640, 480], [640, 0]]) #转换目标点
matrix = cv2.getPerspectiveTransform(pts1, pts2)
result = cv2.warpPerspective(img, matrix, (width,height)) #透视变换
print('Dimensions : ',result.shape)

cv2.imshow("Image", img)
cv2.resizeWindow("Image", 640,480)
cv2.imshow("Perspective transformation", result)
cv2.resizeWindow("Perspective transformation", 640,480)
cv2.waitKey(0)
'''



cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
作用
根据给定的圆心和半径等画圆
参数说明
img：输入的图片data
center：圆心位置
radius：圆的半径
color：圆的颜色
thickness：圆形轮廓的粗细（如果为正）。负厚度表示要绘制实心圆。
lineType： 圆边界的类型。
shift：中心坐标和半径值中的小数位数。




cv2.putText(image, text, (5,50 ), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
位置参数说明：

图片
要添加的文字
文字添加到图片上的位置
字体的类型
字体大小
字体颜色
字体粗细





仿射变换矩阵M = np.float32([[1, 0, 100], [0, 1, 50]，[1，0，5])的各参数的意义如下：
[1, 0, 100]：这一行表示x轴方向上的变换，其中1表示x轴不变，0表示y轴不参与变换，100表示在x轴方向平移100个单位。
[0, 1, 50]：这一行表示y轴方向上的变换，其中0表示x轴不参与变换，1表示y轴不变，50表示在y轴方向平移50个单位。
[1，0，5]：这一行表示一般性的变换，其中1表示w轴不变，0表示x,y轴都不参与变换, 5 代表平移5个单位。
综上，这个矩阵就表示对图像在x轴方向上平移100个单位，在y轴方向上平移





cv2.getPerspectiveTransform()
retval = cv2.getPerspectiveTransform(src, dst)

src：输入图像的四个点的坐标，格式为 [[],[],[],[]]
dst：输出图像的四个点的坐标，格式为 [[],[],[],[]]
函数的返回值是一个 3x3 的透视变换矩阵，该矩阵可以应用于源图像，以实现从源四边形到目标四边形的透视变换。这个矩阵可以通过 cv2.warpPerspective() 函数来应用到源图像上，实现透视变换。










dst = warpPerspective(）
dst = warpPerspective(src, M, dsize[, flags[, borderMode[, borderValue]]])

src：这是源图像，即你希望应用透视变换的图像。通常，这是一个二维的 numpy 数组。

M：这是一个3x3的透视变换矩阵，它描述了如何对源图像进行变换。你可以使用 函数来获取这个矩阵。cv2.getPerspectiveTransform()

dsize：这是一个元组，表示输出图像的大小。通常，它以 的形式指定。输出图像的大小可以与源图像大小不同，你可以选择将其调整为所需的尺寸。(宽度, 高度)

flags：这是一个可选参数，用于指定插值方法。它可以采用以下值之一：

cv2.INTER_NEAREST：最近邻插值。
cv2.INTER_LINEAR：双线性插值（默认）。
cv2.INTER_CUBIC：双三次插值。
cv2.INTER_LANCZOS4：Lanczos插值。
borderMode：这是一个可选参数，用于指定处理边界像素的方式。它可以采用以下值之一：

cv2.BORDER_CONSTANT：使用固定的边界值。
cv2.BORDER_REPLICATE：复制边界像素的值。
cv2.BORDER_REFLECT：反射边界像素。
cv2.BORDER_WRAP：环绕边界像素。
borderValue：这是一个可选参数，用于指定在 模式下要使用的边界值。通常，它是一个标量值，例如 表示黑色。cv2.BORDER_CONSTANT(0, 0, 0)。

'''